#include "stm32f10x.h"                  // Device header
/*1、配置RCC，打开TIMx外设和GPIO外设时钟*/
/*2、配置时基单元，包括时钟源选择*/
/*3、配置输出比较单元，包括CCR的值，输出比较模式。极性选择，输出使能这些参数*/
/*4、配置GPIO，把PWM对应的GPIO口初始化为复用推挽输出配置（引脚定义查看）*/
/*5、运行控制使能*/
void PWM2_Init(void)
{
/*1、配置RCC，打开TIMx外设和GPIO外设时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
/*4、配置GPIO，把PWM对应的GPIO口初始化为复用推挽输出配置（引脚定义查看）*/	
	GPIO_InitTypeDef GPIO_InitStructuer;
	GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出：外设控制输出（而非输出数据寄存器控制输出）
	GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructuer);
	
	TIM_InternalClockConfig(TIM3);
	
/*2、配置时基单元，包括时钟源选择*/
	/*PWM频率：		Freq = CK_PSC/(PSC + 1)/(ARR + 1)*/	
	/*PWM占空比：	Duty = CCR/(ARR + 1)			 */
	/*PWM分辨率：	Reso = 1/(ARR + 1)				 */	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	//实现电机正反转：
	/*PWM频率：	人耳20KHz = 72MHz/(36 - 1 + 1)/(100 - 1 + 1)*/	
	/*PWM占空比：	Duty = CCR/(100 - 1 + 1)				*/
	/*PWM分辨率：	Reso = 1/(100 - 1 + 1)	= 1%		    */	
	
/*3、配置输出比较单元，包括CCR的值，输出比较模式。极性选择，输出使能这些参数*/	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//先把结构体赋一遍默认值（主要是用不上的成员值）
	//然后在修改用的上的成员值
	//TIM_OCInitStructure.TIM_OCIdleState = ;
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
	//TIM_OCInitStructure.TIM_OCNIdleState = ;
	//TIM_OCInitStructure.TIM_OCNPolarity = ;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
	//TIM_OCInitStructure.TIM_OutputNState = ;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;//捕获/比较寄存器的值：CCR
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);
	
/*5、运行控制使能*/
	TIM_Cmd(TIM3, ENABLE);
}
/*修改CCR值，实现PWM占空比的变化效果*/
void PWM2_SetSetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM3, Compare);
}
